import time
import pytest
from utils.driver_utils import get_driver
from utils.mysql_utils import execute_sql_file


# @pytest.fixture(scope="session", autouse=True)
# def data_init_and_destroy():
#
#     # 初始化数据
#     execute_sql_file('./config/init_warehouse_area.sql', 'INIT_WAREHOUSE_AREA')
#     execute_sql_file('./config/init_item_type.sql', 'INIT_ITEM_TYPE')
#
#     yield
#
#     # 销毁数据
#     execute_sql_file('./config/destroy.sql', 'DESTROY')


@pytest.fixture(scope="function")
def driver_handler():

    # 创建浏览器对象
    driver = get_driver()

    # yield 两大作用: 1.暂停并恢复执行 2.返回值但不终止函数
    # 如果想要把返回值传递到测试函数中, 最简单的办法就是中测试函数显示调用这个夹具
    yield driver

    # (自动)关闭浏览器 -> 手动关闭浏览器
    driver.quit()


# pytest_runtest_makereport是pytest内置的钩子函数, 自动执行, 用于生成测试用例的执行结果(skipped/failed/passed等)
# @pytest.hookimpl(hookwrapper=True), 表示可以前后夹击(自定义修改)
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
    # item: 测试用例对象本身, 包括测试类/参数化信息/标记/所在文件路径等
    # call: 测试用例执行过程信息, 包括执行阶段, 执行开始和结束时间, 执行结果等

    outcome = yield # 必须通过yield获取原始流程的结果
    res = outcome.get_result()

    # 打印观察一下钩子函数的执行结果
    # print("------->", res)

    # 如果执行过程中发现执行失败了
    if res.when == "call" and res.failed:

        # 从测试用例对象中获取所有参数
        params = item.funcargs
        # print(params)

        driver = params.get("driver_handler")
        now_time = time.strftime("%Y-%m-%d %H_%M_%S")
        png_name = f'./screenshot/失败截图_{params["case"]["id"]}_{params["case"]["title"]}_{now_time}.png'
        driver.save_screenshot(png_name)

